home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / CmdHistDoc.C < prev    next >
C/C++ Source or Header  |  1990-12-04  |  2KB  |  109 lines

  1. //$CmdHistDocument$
  2.  
  3. #include "CmdHistDoc.h"
  4. #include "ObjList.h"
  5. #include "Menu.h"
  6. #include "CmdNo.h"
  7. #include "Window.h"
  8.  
  9. //--- CmdHistDocument ----------------------------------------------------------
  10.  
  11. MetaImpl(CmdHistDocument, (TP(cmdHistory), 0));
  12.  
  13. CmdHistDocument::CmdHistDocument(const char *doctype) : Document(doctype)
  14. {
  15.     cmdHistory= new ObjList;
  16. }
  17.  
  18. CmdHistDocument::~CmdHistDocument()
  19. {
  20.     cmdHistory->FreeAll();
  21.     SafeDelete(cmdHistory);
  22. }
  23.  
  24. void CmdHistDocument::DoCreateMenu(class Menu *menu)
  25. {
  26.     Document::DoCreateMenu(menu);
  27.     menu->InsertItemAfter(cUNDO, "redo", cREDO);
  28. }
  29.  
  30. void CmdHistDocument::DoSetupMenu(Menu *menu)
  31. {
  32.     Document::DoSetupMenu(menu);
  33.  
  34.     if (changeCount > 0) {
  35.     Command *lastCmd= (Command*) cmdHistory->GetAt(changeCount-1);
  36.     menu->ReplaceItem(cUNDO, lastCmd->GetUndoName());
  37.     menu->EnableItem(cUNDO);
  38.     } else {
  39.     menu->ReplaceItem(cUNDO, "undo");
  40.     menu->DisableItem(cUNDO);
  41.     }
  42.     
  43.     if (changeCount < cmdHistory->Size()) {
  44.     Command *nextCmd= (Command*) cmdHistory->GetAt(changeCount);
  45.     menu->ReplaceItem(cREDO, nextCmd->GetUndoName());
  46.     menu->EnableItem(cREDO);
  47.     } else {
  48.     menu->ReplaceItem(cREDO, "redo");
  49.     menu->DisableItem(cREDO);
  50.     }
  51. }
  52.  
  53. void CmdHistDocument::PerformCommand(Command* cmd)
  54. {
  55.     int i;
  56.     
  57.     // don't do anything on gNoChanges!!
  58.     if (cmd && (cmd != gNoChanges) && (cmd->GetId() || cmd == gResetUndo)) {
  59.     if (cmd != gResetUndo) {
  60.         for (i= changeCount; i < cmdHistory->Size(); i++)
  61.         cmdHistory->RemovePtr(cmdHistory->GetAt(i));
  62.         
  63.         if (cmdHistory->GetAt(changeCount-1) != cmd) {
  64.         cmdHistory->Add(cmd);
  65.         changeCount+= cmd->Do();
  66.         }
  67.     } else {
  68.         // commit all commands
  69.         Iter next(cmdHistory);
  70.         Command *c;
  71.         
  72.         for (i= 0; c= (Command*) next(); i++) {
  73.         cmdHistory->RemovePtr(c);
  74.         if (i < changeCount)
  75.             c->Finish((Command*)cmdHistory->GetAt(i));
  76.         }
  77.         cmdHistory->Empty(0);
  78.         changeCount= 0;
  79.     }
  80.     lastCmd= cmd;
  81.     }
  82.     if (window)
  83.     window->UpdateEvent();
  84. }
  85.  
  86. void CmdHistDocument::Undo()
  87. {
  88.     lastCmd= (Command*) cmdHistory->GetAt(changeCount-1);
  89.     Document::Undo();
  90. }
  91.  
  92. void CmdHistDocument::Redo()
  93. {
  94.     lastCmd= (Command*) cmdHistory->GetAt(changeCount);
  95.     Document::Undo();
  96. }
  97.  
  98. void CmdHistDocument::DeleteCmdHistory()
  99. {
  100.     Iter next(cmdHistory);
  101.     Command *c;
  102.     
  103.     while (c= (Command*) next()) {
  104.     cmdHistory->RemovePtr(c);
  105.     delete c;
  106.     }
  107.     cmdHistory->Empty(0);
  108. }
  109.